package com.aps.demo.engine;

import com.aps.demo.adapter.ModelAdapter;
import com.aps.demo.model.ProductionData;
import com.aps.common.model.APSProductModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据转换引擎
 * 负责协调不同适配器进行数据转换
 */
@Slf4j
@Component
public class DataTransformationEngine {
    
    private final Map<String, ModelAdapter> adapters = new HashMap<>();
    
    @Autowired
    public DataTransformationEngine(List<ModelAdapter> adapterList) {
        for (ModelAdapter adapter : adapterList) {
            String key = adapter.getSupportedIndustry().toLowerCase();
            this.adapters.put(key, adapter);
            log.info("注册适配器: {} -> {}", key, adapter.getSupportedIndustry());
        }
        log.info("数据转换引擎初始化完成，已注册 {} 个适配器", adapters.size());
    }
    
    /**
     * 转换生产数据为APS参数模型
     * 
     * @param rawData 原始生产数据
     * @param targetModel 目标模型类型
     * @return APS参数模型
     */
    public APSProductModel transform(ProductionData rawData, String targetModel) {
        log.info("开始数据转换，目标模型: {}", targetModel);
        
        // 获取适配器
        ModelAdapter adapter = adapters.get(targetModel);
        if (adapter == null) {
            throw new IllegalArgumentException("未找到适配器: " + targetModel);
        }
        
        // 数据清洗和标准化
        ProductionData cleanedData = cleanData(rawData);
        
        // 模型转换
        APSProductModel model = adapter.adapt(cleanedData);
        
        // 验证
        ModelAdapter.ValidationResult validation = adapter.validate(model);
        if (!validation.isValid()) {
            String errorMsg = "模型验证失败: " + String.join(", ", validation.getErrors());
            log.error(errorMsg);
            throw new RuntimeException(errorMsg);
        }
        
        log.info("数据转换完成");
        return model;
    }
    
    /**
     * 数据清洗和标准化
     */
    private ProductionData cleanData(ProductionData rawData) {
        log.info("开始数据清洗...");
        
        // 这里可以添加数据清洗逻辑
        // 例如：去除重复数据、标准化格式、验证数据完整性等
        
        // 暂时直接返回原始数据
        return rawData;
    }
    
    /**
     * 获取所有支持的适配器
     */
    public Map<String, ModelAdapter> getAdapters() {
        return new HashMap<>(adapters);
    }
    
    /**
     * 注册新的适配器
     */
    public void registerAdapter(String name, ModelAdapter adapter) {
        adapters.put(name, adapter);
        log.info("注册适配器: {} -> {}", name, adapter.getSupportedIndustry());
    }
} 